﻿namespace JunFan.Repositories
{
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Linq;
    using Domain;
    using DTO = Dtos;

    public class ItemRepository : RepositoryBase<Item, DTO.Item>
    {
        public override Item Create(Item item)
        {
            DTO.Item dto = MapToDto(item);
            OnContext(ctx =>
                    {
                        ctx.Items.Add(dto);
                        ctx.SaveChanges();
                    });

            return MapToDomain(dto);
        }

        public override Item Read(int id)
        {
            DTO.Item dto = OnContext(ctx => ctx.Items.Find(id));

            return MapToDomain(dto);
        }
        
        public override IEnumerable<Item> ReadAll()
        {
            List<DTO.Item> dtos = OnContext(ctx => ctx.Items.ToList());

            return MapToDomain(dtos);
        }

        public override IEnumerable<Item> ReadAll(Func<Item, bool> filter)
        {
            var predicate = MapPredicate(filter);
            List <DTO.Item> dtos = OnContext(ctx => ctx.Items.Where(predicate).ToList());

            return MapToDomain(dtos);
        }

        public override void Update(Item item)
        {
            DTO.Item dto = MapToDto(item);
            OnContext(ctx =>
            {
                ctx.Entry(dto).State = EntityState.Modified;
                ctx.SaveChanges();
            });
        }

        public override bool Exists(Item item)
        {
            return OnContext(ctx => ctx.Items.Any(itm => itm.ExternalId == item.Id));
        }
    }
}